package com.sks.utils;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.springframework.util.CollectionUtils;

import com.sks.bean.pojo.House;
import com.sks.bean.pojo.Users;
import com.sks.bean.privilege.Employee;
import com.sks.core.SystemConstants;
import com.sks.service.house.HouseService;
import com.sks.service.privilege.SystemPrivilegeService;
import com.sks.web.action.BasicAction;
import com.sks.web.action.privilege.Permission;

/**
 * 
 * @author Administrator
 *
 */
public class WebUtil {
	
	protected static Log log = LogFactory.getLog(WebUtil.class);
	
	//private static EmployeeService employeeService;
	
	private static SystemPrivilegeService permissionService;
	
	private static HouseService houseService;
	
	private static Set<String> allowImagesType = new HashSet<String>();
	
	static {
		try {
			permissionService = (SystemPrivilegeService) WebAppContextUtil.getBean("systemPrivilegeServiceBean");
			houseService = (HouseService) WebAppContextUtil.getBean("houseServiceBean");
		} catch (ServletException e) {
			log.error("", e);
		}
		
		allowImagesType.add("jpg");
		allowImagesType.add("png");
		allowImagesType.add("gif");
		allowImagesType.add("swf");
	}
	
	/**
	 * 获取登录员工
	 */
	public static Employee getEmployee(HttpServletRequest request){
		return (Employee) request.getSession().getAttribute("employee");
	}
	/**
	 * 获取购物车
	 * @param request
	 * @return
	 *//*
	public static BuyCart getBuyCart(HttpServletRequest request){
		return (BuyCart)request.getSession().getAttribute("buyCart");
	}
	*//**
	 * 获取登录用户
	 */
	public static Users getUsers(HttpServletRequest request){
		return (Users) request.getSession().getAttribute("users");
	}
	/**
	 * 删除购物车
	 */
	/*public static void deleteBuyCart(HttpServletRequest request){
		request.getSession().removeAttribute("buyCart");
	}*/
    /***
     * 获取URI的路径,如路径为http://www.babasport.com/action/post.htm?method=add, 得到的值为"/action/post.htm"
     * @param request
     * @return
     */
    public static String getRequestURI(HttpServletRequest request){     
        return request.getRequestURI();
    }
    /**
     * 获取完整请求路径(含内容路径及请求参数)
     * @param request
     * @return
     */
    public static String getRequestURIWithParam(HttpServletRequest request){     
        return getRequestURI(request) + (request.getQueryString() == null ? "" : "?"+ request.getQueryString());
    }
    /**
     * 添加cookie
     * @param response
     * @param name cookie的名称
     * @param value cookie的值
     * @param maxAge cookie存放的时间(以秒为单位,假如存放三天,即3*24*60*60; 如果值为0,cookie将随浏览器关闭而清除)
     */
    public static void addCookie(HttpServletResponse response, String name, String value, int maxAge) {        
        Cookie cookie = new Cookie(name, value);
        cookie.setPath("/");
        if (maxAge>0) cookie.setMaxAge(maxAge);
        response.addCookie(cookie);
    }
    
    /**
     * 获取cookie的值
     * @param request
     * @param name cookie的名称
     * @return
     */
    public static String getCookieByName(HttpServletRequest request, String name) {
    	Map<String, Cookie> cookieMap = WebUtil.readCookieMap(request);
        if(cookieMap.containsKey(name)){
            Cookie cookie = (Cookie)cookieMap.get(name);
            return cookie.getValue();
        }else{
            return null;
        }
    }
    
    protected static Map<String, Cookie> readCookieMap(HttpServletRequest request) {
        Map<String, Cookie> cookieMap = new HashMap<String, Cookie>();
        Cookie[] cookies = request.getCookies();
        if (null != cookies) {
            for (int i = 0; i < cookies.length; i++) {
                cookieMap.put(cookies[i].getName(), cookies[i]);
            }
        }
        return cookieMap;
    }
    /**
     * 去除html代码
     * @param inputString
     * @return
     */
    public static String HtmltoText(String inputString) {
        String htmlStr = inputString; //含html标签的字符串
        String textStr ="";
        java.util.regex.Pattern p_script;
        java.util.regex.Matcher m_script;
        java.util.regex.Pattern p_style;
        java.util.regex.Matcher m_style;
        java.util.regex.Pattern p_html;
        java.util.regex.Matcher m_html;          
        java.util.regex.Pattern p_ba;
        java.util.regex.Matcher m_ba;
        
        try {
            String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>"; //定义script的正则表达式{或<script[^>]*?>[\\s\\S]*?<\\/script> }
            String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>"; //定义style的正则表达式{或<style[^>]*?>[\\s\\S]*?<\\/style> }
            String regEx_html = "<[^>]+>"; //定义HTML标签的正则表达式
            String patternStr = "\\s+";
            
            p_script = Pattern.compile(regEx_script,Pattern.CASE_INSENSITIVE);
            m_script = p_script.matcher(htmlStr);
            htmlStr = m_script.replaceAll(""); //过滤script标签

            p_style = Pattern.compile(regEx_style,Pattern.CASE_INSENSITIVE);
            m_style = p_style.matcher(htmlStr);
            htmlStr = m_style.replaceAll(""); //过滤style标签
         
            p_html = Pattern.compile(regEx_html,Pattern.CASE_INSENSITIVE);
            m_html = p_html.matcher(htmlStr);
            htmlStr = m_html.replaceAll(""); //过滤html标签
            
            p_ba = Pattern.compile(patternStr,Pattern.CASE_INSENSITIVE);
            m_ba = p_ba.matcher(htmlStr);
            htmlStr = m_ba.replaceAll(""); //过滤空格
         
         textStr = htmlStr;
         
        }catch(Exception e) {
                    System.err.println("Html2Text: " + e.getMessage());
        }          
        return textStr;//返回文本字符串
     }
    
    /**
	 * 权限校验
	 * @return
     * @throws ServletException 
     * @throws  
     * @throws Exception 
	 */
	public static boolean validate(HttpServletRequest request, Action action, ActionMapping mapping) throws ServletException  {
		
		/*if (null == employeeService) {
			employeeService = (EmployeeService) WebAppContextUtil.getBean("employeeServiceBean");
		}*/
		
		Method method = getCurrentMethod(request, action, mapping);
		if (method != null && method.isAnnotationPresent(Permission.class)) {
			
			try {
				//得到方法上的注解
				Permission permission = method.getAnnotation(Permission.class);
				//下面是得到执行方法需要的权限
				//SystemPrivilege methodPrivilege = new SystemPrivilege(new SystemPrivilegePK(permission.module(), permission.privilege()));
				Employee employee = WebUtil.getEmployee(request);
				//employee = employeeService.find(employee.getUsername());
				/*for (PrivilegeGroup group : employee.getGroups()) {
					if (group.getPrivileges().contains(methodPrivilege)) {
						return true;
					}
				}
				return false;*/
				return hasPermission(employee, permission.module(), permission.privilege());
			} catch (Exception e) {
				log.error("validate error:", e);
				return false;
			}
		}
		return true;
	}
	
	public static boolean hasPermission(String empName, String module, String privilege) {
		try {
			/*SystemPrivilege methodPrivilege = new SystemPrivilege(
					new SystemPrivilegePK(module, privilege));
			Employee employee = employeeService.find(empName);
			for (PrivilegeGroup group : employee.getGroups()) {
				if (group.getPrivileges().contains(methodPrivilege)) {
					return true;
				}
			}
			return false;*/
			return permissionService.hasPrivilege(empName, module, privilege);
		} catch (Exception e) {
			log.error("check permission error:", e);
			return false;
		}
	}
	
	public static boolean hasPermission(Employee emp, String module, String privilege) {
		if (null == emp) {
			return false;
		}
		return hasPermission(emp.getUsername(), module, privilege);
	}
	
	public static boolean hasPermission(HttpServletRequest request, String module, String privilege) {
		if (null == request) {
			return false;
		}
		return hasPermission(getEmployee(request), module, privilege);
	}
	
	/**
	 * 获取用户当前执行的方法
	 * @return
	 */
	public static Method getCurrentMethod(HttpServletRequest request, Action action,
			ActionMapping mapping) {
		String methodName = "execute";
		
		//判断BasicAction或DispatchAction是否是action.getClass()的父类
		if (BasicAction.class.isAssignableFrom(action.getClass()) || DispatchAction.class.isAssignableFrom(action.getClass())) {
			methodName = request.getParameter(mapping.getParameter());//取得由请求参数指定的方法名称
		}
		try {
			return action.getClass().getMethod(methodName, ActionMapping.class, ActionForm.class,
				HttpServletRequest.class, HttpServletResponse.class);
		} catch (Exception e) {
			log.error("get method error:", e);
		}
		return null;
	}
	
	public static boolean isAllowImagesType(String type) {
		if (null == type) {
			return false;
		}
		return allowImagesType.contains(type.toLowerCase());
	}
	
	public static String getWebRoot() {
		return System.getProperty(SystemConstants.SKS_WEB_ROOT);
	}
	
	public static List<House> getHouseHistory(HttpServletRequest request) {
		try {
			HttpSession session = request.getSession(true);
			List<Integer> hs = (List<Integer>) session.getAttribute(SystemConstants.SYS_HISTORY_HOUSE);
			if (CollectionUtils.isEmpty(hs)) {
				return null;
			}
			
			StringBuffer p = new StringBuffer("select o " + "from House o where o.houseId in (");
			for (int i = 0; null != hs && i < hs.size(); i++) {
				if (i == 0) {
					p.append("?");
				} else {
					p.append(", ?");
				}
			}
			p.append(")");
			
			return houseService.getListByJpql(p.toString(), hs.toArray());
		} catch (Exception e) {
			log.error("get house history error:", e);
			return null;
		}
	}
}
